package com.qf.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Aspect  配置切面类
 *
 * 切面=切入点+增强
 * @Component 创建切面类对象，存入到容器当中
 */
@Aspect
@Component
public class AspectDemo {
    //定义切入点表达式
    @Pointcut("execution(* com.qf.service..*.*(..))")
    public void pc(){}

//    @Before("pc()")
//    public void before(){
//        System.out.println("在方法之前执行");
//    }
//
//    @AfterReturning("pc()")
//    public void afterReturning(){
//        System.out.println("在方法之后执行   如果有异常不执行");
//    }
//    @After("pc()")
//    public void after(){
//        System.out.println("在方法之后执行  异常不影响其执行");
//    }
//    @AfterThrowing("pc()")
//    public void afterThrowing(){
//        System.out.println("有异常会执行此方法");
//    }

    /**
     * ProceedingJoinPoint  连接点（方法），包含了拦截的方法的一切
     * @param joinPoint
     * @return
     */
    @Around("pc()")
    public Object around(ProceedingJoinPoint joinPoint){
        try {
            System.out.println("前置");
            Object result = joinPoint.proceed();
            System.out.println("后置，有异常不执行");
            return result;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("异常增强");
        } finally {
            System.out.println("后置，有没有异常都执行");
        }
        return null;
    }


}
